#多继承

#例子：三代机器人

#机器人一代
class Robot1(object):
    def __init__(self,year,name):   #初始化设置
        self.year = year            #实例属性
        self.name = name

    def walk(self):
        print('%s只能平地行走，遇到障碍物会摔倒' %self.name)

    def produce(self):
        print('{}年生产的机器人，名字是{}'.format(self.year,self.name))

rot1 = Robot1(2000,'罗马一代')
rot1.walk()
rot1.produce()
print('\n')

#机器人二代
class Robot2(Robot1):   #继承一代
    def walk(self):    #对父类进行重写walk()
        print('%s可以避开障碍物' %self.name)
rot2 = Robot2(2002,'罗马二代')
rot2.walk()
rot2.produce()
print('\n')

#机器人三代
class Robot3(Robot2):   #多继承
    def run(self):             #新增方法
        print('%s可以跑步' %self.name)
rot3 = Robot3(2004,'罗马三代')
rot3.run()
rot3.produce()
print(Robot3.__mro__)
print('\n')




#多态
'''
多态：是指一类实物有多种形态。
多态性：一种调用方式，不同的执行效果。
（一个抽象类和多个子类，因而多态的概念依赖于继承）

定义：
多态是一种使用对象的方式，子类重写父类方法，调用不同子
类对象的相同父类方法，可以产生不同的执行结果。

好处：
调用灵活，有了多态，更容易编写出通用的代码，做出通用的
编程，以适应需求的不断变化！
1）可以增加代码的灵活性；
2）以继承和重写父类方法为前提；
3）是调用方法的技巧，不会影响到类的内部设计。

'''
#容器类型和多种形态：字符串、列表、元组、字典……

#1. +号的多态性
print(1+2)                #加法运算
print('hello '+'python')  #字符串拼接
print('\n')

#2. len()传不同的参数，也体现多态性
print('world',len('world'))       
print('[1,2,3]',len('[1,2,3]'))
print('\n')

#3. 动物的多态性
class Animal:
    def run(self):  
        print('动物在走')
class People(Animal):
    def run(self):        #重写父类方法
        print('人正在走')
class Pig(Animal):
    def run(self):
        print('猪也在走')

peo1 = People()
pig1 = Pig()
pig1.run()
peo1.run()       #意义在于根据不同对象处理不同事情
print('\n')


#多态实现步骤：
'''
1）定义父类，并提供一个公共方法
2）定义子类，并重写父类方法
3）传递子类对象给调用者，可以看到不同子类执行效果不同
（多态发生在具有继承关系的基础之上）

'''
#实现多态的两个前提：
'''
1)继承：多态必须发生在父类与子类之间
2)重写：子类重写父类方法

'''
class A:                 #父类
    def show(self):
        print('A.show')
class S1(A):             #子类S1
    def show(self):
        print('S1.show')
class S2(A):             #子类S2
    def show(self):
        print('S2.show')

#定义一个统一接口
def func(obj):      #统一接口函数
    obj.show()      #函数体调用show()方法

#为S1类创建对象s1
s1 = S1()
func(s1)            #s1.show
    
s2 = S2()
func(s2)            #s2.show

#现在额外增加S3类--多态实现程序的可扩展性，无需修改原代码
class S3(A):
    def show(self):
        print('S3.show')

s3 = S3()
func(s3)
